package com.ljf.spring.interceptor;

import com.ljf.framework.fun.LjfParamFunction;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 综合拦截器，提供注解鉴权和路由拦截鉴权能力
 */
public class LjfInterceptor implements HandlerInterceptor {

	/**
	 * 是否打开注解鉴权
	 */
	public boolean isAnnotation = true;

	/**
	 * 认证函数：每次请求执行
	 * <p> 参数：路由处理函数指针
	 */
	public LjfParamFunction<Object> auth = handler -> {};

	/**
	 * 创建一个 Sa-Token 综合拦截器，默认带有注解鉴权能力
	 */
	public LjfInterceptor() {
	}

	/**
	 * 创建一个 Sa-Token 综合拦截器，默认带有注解鉴权能力
	 * @param auth 认证函数，每次请求执行
	 */
	public LjfInterceptor(LjfParamFunction<Object> auth) {
		this.auth = auth;
	}

	/**
	 * 设置是否打开注解鉴权
	 * @param isAnnotation /
	 * @return 对象自身
	 */
	public LjfInterceptor isAnnotation(boolean isAnnotation) {
		this.isAnnotation = isAnnotation;
		return this;
	}

	/**
	 * 写入[认证函数]: 每次请求执行
	 * @param auth /
	 * @return 对象自身
	 */
	public LjfInterceptor setAuth(LjfParamFunction<Object> auth) {
		this.auth = auth;
		return this;
	}


	// ----------------- 验证方法 -----------------

	/**
	 * 每次请求之前触发的方法
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		try {

			if(isAnnotation && handler instanceof HandlerMethod) {
				// TODO 注解校验
			}

			// Auth 校验
			auth.run(handler);

		} catch (Exception e) {
			// 停止匹配，向前端输出结果
			if(response.getContentType() == null) {
				response.setContentType("text/plain; charset=utf-8");
			}
			response.getWriter().print(e.getMessage());
			return false;
		}

		// 通过验证
		return true;
	}

}
